package com.zhai.boot.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author Created by 翟凤玺
 * @package com.zhai.boot.util
 * @project-name zhai-boot
 * @description MD5工具类
 * @create-datetime 2020-7-24 09:55
 */
public class MD5Util {

    public static final String MD5 = "MD5";
    public static final String UTF8 = "UTF-8";
    public static final String MD5_EXCEPTION = "MD5应该支持吗？";
    public static final String UTF8_EXCEPTION = "UTF-8应该支持吗？";
    public static final String ZERO = "0";

    /**
     * MD5加密字符串（32位）
     *
     * @param string 需要进行MD5加密的字符串
     * @return 加密后的字符串
     */
    public static String md5Encrypt32(String string) {
        byte[] hash;
        try {
            //创建一个MD5算法对象，并获得MD5字节数组,16*8=128位
            hash = MessageDigest.getInstance(MD5).digest(string.getBytes(UTF8));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(MD5_EXCEPTION, e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(UTF8_EXCEPTION, e);
        }

        //转换为十六进制字符串
        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10) hex.append(ZERO);
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return hex.toString();
    }

    /**
     * MD5加密字符串（32位大写）
     *
     * @param string 需要进行MD5加密的字符串
     * @return 加密后的字符串（大写）
     */
    public static String md5Encrypt32Upper(String string) {
        return MD5Util.md5Encrypt32(string).toUpperCase();
    }

    /**
     * MD5加密字符串（32位小写）
     *
     * @param string 需要进行MD5加密的字符串
     * @return 加密后的字符串（小写）
     */
    public static String md5Encrypt32Lower(String string) {
        return MD5Util.md5Encrypt32(string).toLowerCase();
    }

    public static void main(String[] args) {
        String md5Encrypt32Lower = MD5Util.md5Encrypt32Lower("01234Aa#$%^");
        String md5Encrypt32Upper = MD5Util.md5Encrypt32Upper("01234Aa#$%^");
        System.out.println(StringUtil.join("MD5", "大写=" + md5Encrypt32Upper + "，小写=" + md5Encrypt32Lower));
    }
}